package voxToolkit;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

import audio.GerenteAudio;


public class VoxEventos implements ListSelectionListener,
								FocusListener, ActionListener,
								KeyListener, ChangeListener
{
	private GerenteAudio audio;
	
	static private VoxEventos instancia = null;
	
	private VoxEventos()
	{
		/*
		 * Não vamos tratar fim de fala nem os erros 
		 *    (estes serão tratados diretamente no gerente de Audio)
		 *    pois o VoxToolkit só manda pequenas mensagens para o
		 *    sintetizador ou o tocador de waves (por isso não precisamos
		 *    do listener).
		 */
		audio = GerenteAudio.instancia();
	}
	
	public static VoxEventos instancia()
	{
		if ( instancia == null )
			instancia = new VoxEventos();
		
		return instancia;
	}

	@Override
	public void focusGained(FocusEvent e) 
	{
		if ( e.getSource() instanceof VoxCombo )
		{
			VoxCombo voxCombo = (VoxCombo) e.getSource();
			audio.falaSintetizada( voxCombo.getRotulo() +". " + voxCombo.getSelectedItem().toString());
		}
		else if ( e.getSource() instanceof VoxList )
		{
			VoxList voxList = (VoxList) e.getSource();
			if (voxList.getSelectedValue() != null)
				audio.falaSintetizada(voxList.getRotulo() +". " + voxList.getSelectedValue().toString());
			else
				audio.falaSintetizada(voxList.getRotulo() +". ");
		}
		else if ( e.getSource() instanceof VoxSlider )
		{
			VoxSlider voxSlider = (VoxSlider) e.getSource();
			audio.falaSintetizada( (String)voxSlider.getRotulo() +
								   (String)voxSlider.getValor());
		}
		else if ( e.getSource() instanceof VoxCheckBox )
		{
			VoxCheckBox  voxCheckBox = (VoxCheckBox) e.getSource();
			if(KeyEvent.KEY_PRESSED == 401)
			{ 				
            	if (voxCheckBox.isSelected() )
            	{			
            		audio.falaSintetizada( voxCheckBox.getText()+ ". Caixa de Verificação. " +  "Marcado");
            	}
            	else 
            	{
            		audio.falaSintetizada( voxCheckBox.getText() +  ". Caixa de Verificação. " + "Não Marcado");
            	}			
            }            
		}
	}
	
	@Override
	public void focusLost(FocusEvent e) 
	{
		//if ( e.getSource() instanceof VoxList )
		audio.abortaAudio();
	}

	@Override
	public void actionPerformed(ActionEvent e) 
	{
		if ( e.getSource() instanceof VoxCombo )
		{
			VoxCombo voxCombo = (VoxCombo)e.getSource();
			audio.falaSintetizada( (String)voxCombo.getSelectedItem());
		}
		else if ( e.getSource() instanceof VoxCheckBox )
		{
			VoxCheckBox  voxCheckBox = (VoxCheckBox)e.getSource();
			if (voxCheckBox.isSelected() )
			{			
				audio.falaSintetizada(" Marcado");
			}
			else 
			{
				audio.falaSintetizada(" Não Marcado");
			}
		}
		/* else if (e.getSource() instanceof VoxListFiles)
		   {
			VoxListFiles lista = (VoxListFiles) e.getSource();
			if (! lista.isSelectionEmpty()){			
				int indice = lista.getSelectedIndex();
				
				if ((String) lista.getModel().getElementAt(indice).toString() == ".."){
					lista.exibeAcima();
				}
				else{
					lista.exibeAbaixo(indice);
				}
			}
		}*/
		
	}

	@Override
	public void valueChanged(ListSelectionEvent e) 
	{
		if (e.getSource() instanceof VoxList) 
		{
			audio.abortaAudio();
			VoxList lista = (VoxList)e.getSource();
			if (! lista.isSelectionEmpty())
			{
				audio.falaSintetizada(lista.getSelectedValue().toString());				
			}
		}
		
	}

	@Override
	public void keyPressed(KeyEvent arg0) 
	{
		// TODO Auto-generated method stub
		
	}

	@Override
	public void keyReleased(KeyEvent arg0) 
	{
		// TODO Auto-generated method stub
		
	}

	@Override
	public void keyTyped(KeyEvent e) 
	{
		/*if (e.getSource() instanceof VoxListFiles){
			VoxListFiles lista = (VoxListFiles) e.getSource();
			if (! lista.isSelectionEmpty()){
				if (e.getKeyChar() == KeyEvent.VK_ENTER){
					int indice = lista.getSelectedIndex();
					
					if ((String) lista.getModel().getElementAt(indice).toString() == ".."){
						lista.exibeAcima();
					}
					else{
						lista.exibeAbaixo(indice);
					}
				}
			}
		}*/
		
	}

	@Override
	public void stateChanged(ChangeEvent e) 
	{
		if ( e.getSource() instanceof VoxSlider )
		{
			VoxSlider voxSlider = (VoxSlider)e.getSource();
			audio.falaSintetizada( voxSlider.getValor() );
		}		
	}

}


